package thread;

/**
 * 多线程
 * 线程：一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。
 * 多线程：多个单一顺序执行的流程并发运行。造成“感官上同时运行”的效果。
 * <p>
 * 多个线程实际运行是走走停停的。线程调度程序会将CPU运行时间划分为若干个时间片段并
 * 尽可能均匀的分配给每一个线程，拿到时间片的线程被CPU执行这段时间。当超时后线程调度
 * 程序会再次分配一个时间片段给一个线程使得CPU执行它，如此反复。由于CPU执行时间在
 * 纳秒级别，我们感觉不到切换线程运行的过程。所有微观上走走停停，宏观上感觉一起运行
 * 的现象成为并发运行！
 *
 *
 * 第一种创建线程的方式:
 *  * 定义一个类继承自Thread，并重写run方法。在run方法中定义要与其他线程并发运行的任务
 *  * 启动线程时要使用start方法!
*/
public class ThreadDemo1 {
    public static void main(String[] args) {
        //1:实例化线程
        Thread T1 = new MyThread1();
        Thread T2 = new MyThread2();
        //2:启动线程,注意！不能直接调用run方法
        T1.start();//start方法调用后线程纳入线程调度程序控制。run会自动执行。
        T2.start();
    }
}

/**
 * 第一种创建线程的方式优点在于结构简单。便于匿名内部类形式创建。
 * 缺点：
 * 1：直接继承线程，会导致不能再继承其他类去复用方法，这在实际开发中是非常不便的
 * 2：定义线程的同时重写了run方法，会导致线程与线程任务绑定一起，不利于线程的重用。
 *
 */
class MyThread1 extends Thread {
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("你是谁呀？");
        }
    }
}

class MyThread2 extends Thread {
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("开门！我是你爸爸！");
        }
    }
}

